package com.lb.jwitter.action;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Map;

import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;

import com.lb.jwitter.service.ConditionReport;
import com.lb.jwitter.service.TblCTDTDMTietHocService;
import com.lb.jwitter.service.TblDKMHKetquaService;
import com.lb.jwitter.service.TblDKMHLogKetQuaDangKy;
import com.lb.jwitter.service.TblDKMHLogKetQuaDangKyService;
import com.lb.jwitter.service.TblDKMHTaiKhoanHocVien;
import com.lb.jwitter.util.ApplicationContextProvider;
import com.lb.jwitter.util.KetQuaDangKy;
import com.lb.jwitter.util.QuyenDangKy;
import com.lb.jwitter.util.ThoiKhoaBieuDuKien;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;

@ContextConfiguration(locations = "classpath:beans.xml")
public class XoaKetQuaDangKyAction {

	private TblDKMHTaiKhoanHocVien tblDKMHTaiKhoanHocVien;

	public TblDKMHTaiKhoanHocVien getTblDKMHTaiKhoanHocVien() {
		return tblDKMHTaiKhoanHocVien;
	}

	public void setTblDKMHTaiKhoanHocVien(
			TblDKMHTaiKhoanHocVien tblDKMHTaiKhoanHocVien) {
		this.tblDKMHTaiKhoanHocVien = tblDKMHTaiKhoanHocVien;
	}

	private int soTietTrongNgay;

	public int getSoTietTrongNgay() {
		return soTietTrongNgay;
	}

	private List<KetQuaDangKy> ketQuaDangKys;

	public List<KetQuaDangKy> getKetQuaDangKys() {
		return ketQuaDangKys;
	}

	public void setKetQuaDangKys(List<KetQuaDangKy> ketQuaDangKys) {
		this.ketQuaDangKys = ketQuaDangKys;
	}

	private int ketquaId;

	public int getKetquaId() {
		return ketquaId;
	}

	public void setKetquaId(int ketquaId) {
		this.ketquaId = ketquaId;
	}

	private TblCTDTDMTietHocService tblCTDTDMTietHocService;

	private String msg;

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	private String code;

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	@Autowired
	// Injected by Spring
	ApplicationContextProvider contextProvider;

	public String execute() throws Exception {

		Map session = ActionContext.getContext().getSession();
		tblDKMHTaiKhoanHocVien = (TblDKMHTaiKhoanHocVien) session
				.get("taiKhoanHocVien");
		if (tblDKMHTaiKhoanHocVien == null)
			return "noprivilege";

		Integer dotDKId = (Integer) session.get("dotDKId");

		ApplicationContext context = contextProvider.getApplicationContext();

		tblCTDTDMTietHocService = (TblCTDTDMTietHocService) context
				.getBean("tbl_CTDT_DM_TietHocClient");
		TblDKMHKetquaService tblDKMHKetquaService = (TblDKMHKetquaService) context
				.getBean("tbl_DKMH_KetquaClient");

		ketQuaDangKys = (List<KetQuaDangKy>) session.get("ketQuaDangKys");
		boolean trongHanDK = (Boolean) session.get("trongHanDK");
		QuyenDangKy quyenDK = (QuyenDangKy) session.get("quyenDK");
		if (trongHanDK ) {
			for (KetQuaDangKy ketqua : ketQuaDangKys) {
				if (ketqua.getKetqua().getId().equals(new Long(ketquaId))) {
					
					//duoc quyen Huy hoac ket qua cua mon hoc la chua thanh cong
					if(quyenDK.getDelete() || !ketqua.getKetqua().getKetQua().equals("*")){
						//KhoaMonHoc - KX:khoa khong cho huy va hieu chinh
						if (!ketqua.getKetqua().getKhoaMonHocYN().equals("KX")) {
	
							//ket qua la DK moi
							if(ketqua.getKetqua().getTinhTrang().equals("RN")){
								tblDKMHKetquaService.deletetblDKMHKetqua(ketqua.getKetqua().getId());
								ketQuaDangKys.remove(ketqua);
								
								if(ketqua.getKetqua().isXacNhanYN()){
									TblDKMHLogKetQuaDangKyService tblDKMHLogKetQuaDangKyService = (TblDKMHLogKetQuaDangKyService) context.getBean("tbl_DKMH_LogKetQuaDangKyClient");
									
									TblDKMHLogKetQuaDangKy tblDKMHLogKetQuaDangKy = new TblDKMHLogKetQuaDangKy();
				    				tblDKMHLogKetQuaDangKy.setDotDKId(ketqua.getKetqua().getDotDKId());
				    				tblDKMHLogKetQuaDangKy.setHocVienId(ketqua.getKetqua().getHocVienId());
				    				tblDKMHLogKetQuaDangKy.setNlmhId(ketqua.getKetqua().getNLMHId());
				    				
				    				if (ketqua.getKetqua().getMaDieuChinh().equals("BS"))
				    					tblDKMHLogKetQuaDangKy.setMaDieuChinh("BH");
									else if (ketqua.getKetqua().getMaDieuChinh().equals("HC"))
										tblDKMHLogKetQuaDangKy.setMaDieuChinh("HH");
				
				    				DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
				    				Date dd = new Date();
				    				GregorianCalendar c = new GregorianCalendar();
				    				c.setTime(dd);
				    				XMLGregorianCalendar d = DatatypeFactory.newInstance()
				    						.newXMLGregorianCalendar(c);
				    				tblDKMHLogKetQuaDangKy.setNgayGhiLog(d);
				    				
				    				tblDKMHLogKetQuaDangKyService.createtblDKMHLogKetQuaDangKy(tblDKMHLogKetQuaDangKy);
								}
							}
							//ket qua da duoc xu ly
							else if(ketqua.getKetqua().getTinhTrang().equals("RC")){
								ketqua.setDelete(true);
	
								DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
								Date dd = new Date();
								GregorianCalendar c = new GregorianCalendar();
								c.setTime(dd);
								XMLGregorianCalendar d = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
								ketqua.getKetqua().setNgayCapNhat(d);
	
								if (ketqua.getKetqua().getMaDieuChinh().equals("BS"))
									ketqua.getKetqua().setMaDieuChinh("BH");
								else if (ketqua.getKetqua().getMaDieuChinh().equals("HC"))
									ketqua.getKetqua().setMaDieuChinh("HH");
	
								ketqua.getKetqua().setXacNhanYN(false);
								// cap nhat database
								tblDKMHKetquaService.updatetblDKMHKetqua(ketqua.getKetqua());
							}
							//ket qua dang duoc xu ly- khong duoc phep rut mon hoc
							else if(ketqua.getKetqua().getTinhTrang().equals("RE")){
								code = "ERROR";
								msg = " Môn học đang được xử lý, không được phép hủy!!!";
								return Action.ERROR;
							}
						}else{
							code = "ERROR";
							msg = " Kh\u00F3a kh\u00F4ng cho hi\u1EC7u ch\u1EC9nh v\u00E0 h\u1EE7y m\u00F4n h\u1ECDc, M\u00F4n h\u1ECDc c\u1EE9ng!!!";
							return Action.ERROR;
						}//if khoamonhocYN KX
						
					break;
					}else{
						code = "ERROR";
						msg = " Bạn không có quyền HỦY môn học trong đợt này!!!";
						return Action.ERROR;
					}
				}//end-if ketqua == ketquaId
			}//end-for
			
		}
		//het han huy mon hoc
		else {
			
			for (KetQuaDangKy ketqua : ketQuaDangKys) {
				if (ketqua.getKetqua().getId().equals(new Long(ketquaId))) {
					//KhoaMonHoc - KX:khoa khong cho huy va hieu chinh
					if (!ketqua.getKetqua().getKhoaMonHocYN().equals("KX")) {

						//ngoai han huy mon hoc, nhung la mon hoc moi chua xac nhan thi co the huy
						//ket qua la DK moi va chua xac nhan
						if(ketqua.getKetqua().getMaDieuChinh().equals("BS")
								&& !ketqua.getKetqua().isXacNhanYN() 
								&& ketqua.getKetqua().getTinhTrang().equals("RN")){
							
							//neu da luu DB -> xoa dDB
							if(ketqua.getKetqua().getId()!= null)
								tblDKMHKetquaService.deletetblDKMHKetqua(ketqua.getKetqua().getId());
							//xoa monhoc khoi session
							ketQuaDangKys.remove(ketqua);
							
							soTietTrongNgay = tblCTDTDMTietHocService
									.counttblCTDTDMTietHocByCondition(new ArrayList<ConditionReport>());

							session.put("ketQuaDangKys", ketQuaDangKys);
							return Action.SUCCESS;
						}
					}else{
						code = "ERROR";
						//khoa khong cho hieu chinh va huy mo hoc
						msg = "Khóa không cho hiệu chỉnh và hủy môn học!!!";
						return Action.ERROR;
					}
					break;
				}
			}
			code = "ERROR";
			//het han huy mon hoc
			msg = "Đã hết hạn hủy môn học!!!";
			return Action.ERROR;
		}//end-if trongHanDK && Delete = true
					
		List<ConditionReport> cons = new ArrayList<ConditionReport>();
    	{ 
	        ConditionReport con = new ConditionReport(); 
	        con.setCol("ma");
	        con.setValue1("0");
	        con.setOperator("ne");
	        cons.add(con);	
	   }
	    soTietTrongNgay = tblCTDTDMTietHocService.counttblCTDTDMTietHocByCondition(cons);

		session.put("ketQuaDangKys", ketQuaDangKys);
		return Action.SUCCESS;

	}

}
